package com.lsh.netty.http.xml;

import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.http.*;
import org.springframework.http.HttpHeaders;

import java.util.List;

/**
 * @author ：LiuShihao
 * @date ：Created in 2021/6/8 9:19 下午
 * @desc ：应答消息编码类
 */
public class HttpXmlResponseEncoder extends AbstractHttpXmlEncoder<HttpXmlResponse> {
    @Override
    protected void encode(ChannelHandlerContext ctx, HttpXmlResponse msg, List<Object> out) throws Exception {
        System.out.println("应答消息编码："+msg.getResult());
        ByteBuf body = encode0(ctx, msg.getResult());
        FullHttpResponse response = msg.getHttpResponse();
        //如果业务侧已经构造了HTTP应答消息，则利用业务已有应答消息重新复制一个新的HTTP应答消息，
        // 无法重用业务侧自定义的主要原因是Netty的DefaultFullHttpResponse 没有提供动态设置消息体content的接口
        //只能在第一次构造的时候设置内容，
        if (response == null) {
            response = new DefaultFullHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.OK, body);
        } else {
            response = new DefaultFullHttpResponse(msg.getHttpResponse().protocolVersion(),
                    msg.getHttpResponse().status(), body);
        }
        //设置消息体的内容格式为 text/xml 然后在消息头中设置消息长度，
        response.headers().set(HttpHeaders.CONTENT_TYPE, "text/xml");
        response.headers().setInt(HttpHeaderNames.CONTENT_LENGTH, body.readableBytes());
        //把编码后的DefaultFullHTTPResponse 对象添加到编码结果列表中，由后续Netty的HTTP编码类进行二次编码
        out.add(response);
    }

}
